from flask import Blueprint, request, jsonify
import requests
import os
from datetime import datetime
from services.user_service import user_service
from utils.cache_manager import cache_manager, generate_wechat_cache_key, generate_openid_cache_key

# 创建微信控制器蓝图
wechat_bp = Blueprint('wechat', __name__)

# 微信小程序配置（实际项目中应从环境变量或配置文件读取）
WECHAT_APP_ID = os.environ.get('WECHAT_APP_ID', 'wx1829314bc5b6a512')
WECHAT_APP_SECRET = os.environ.get('WECHAT_APP_SECRET', '9482762150be266efe80b8806356f69e')
WECHAT_API_URL = 'https://api.weixin.qq.com/sns/jscode2session'

@wechat_bp.route('/login', methods=['POST'])
def wechat_login():
    """
    微信小程序登录接口
    前端传递code，后端调用微信API获取openid和session_key
    """
    try:
        # 获取请求数据
        data = request.get_json()
        if not data or 'code' not in data:
            return jsonify({
                'code': 400,
                'message': '缺少必要参数code',
                'data': None
            })
        
        code = data['code']
        
        # 尝试从缓存获取会话信息
        cache_key = generate_wechat_cache_key(code)
        cached_result = cache_manager.get(cache_key)
        
        if cached_result:
            # 使用缓存的会话信息
            print(f"使用缓存的微信会话信息，code: {code}")
            result = cached_result
        else:
            # 调用微信服务器API
            params = {
                'appid': WECHAT_APP_ID,
                'secret': WECHAT_APP_SECRET,
                'js_code': code,
                'grant_type': 'authorization_code'
            }
            
            response = requests.get(WECHAT_API_URL, params=params)
            result = response.json()
            
            # 如果成功获取，且包含expires_in，则缓存会话信息
            if 'errcode' not in result and 'expires_in' in result:
                # 微信返回的expires_in单位是秒，通常为7200秒（2小时）
                expires_in = result.get('expires_in', 7200)
                # 为了安全起见，我们设置缓存时间比实际过期时间少1分钟
                cache_time = max(0, expires_in - 60)
                cache_manager.set(cache_key, result, cache_time)
                print(f"缓存微信会话信息，过期时间: {cache_time}秒，code: {code}")
        
        # 检查是否有错误
        if 'errcode' in result and result['errcode'] != 0:
            return jsonify({
                'code': result['errcode'],
                'message': f'微信登录失败: {result.get("errmsg", "未知错误")}',
                'data': None
            })
        
        # 成功获取openid和session_key
        # 准备用户数据
        user_data = {
            'openid': result.get('openid'),
            'session_key': result.get('session_key'),
            'unionid': result.get('unionid'),
            'expires_in': result.get('expires_in')
        }
        
        # 同时缓存openid信息，便于后续快速访问
        if user_data['openid'] and user_data.get('expires_in'):
            openid_cache_key = generate_openid_cache_key(user_data['openid'])
            openid_cache_data = {
                'session_key': user_data['session_key'],
                'unionid': user_data.get('unionid')
            }
            # 设置与session_key相同的过期时间
            openid_cache_time = max(0, user_data['expires_in'] - 60)
            cache_manager.set(openid_cache_key, openid_cache_data, openid_cache_time)
        
        # 检查用户是否存在，如果不存在则创建
        user = user_service.get_user_by_openid(user_data['openid'])
        if not user:
            # 创建新用户
            user = user_service.create_user(user_data)
        else:
            # 更新现有用户的session_key和登录时间
            user = user_service.update_user(user_data['openid'], user_data)
        
        # # 生成用户登录token
        # token = user_service.generate_token(user)
        
        # 返回登录结果（不包含敏感信息）
        # 将user对象解构到data中
        data = {
            'login_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        }
        # 如果user存在，将其属性直接添加到data中（包含session_key）
        if user:
            data.update(user.to_dict())
        
        return jsonify({
            'code': 200,
            'message': '登录成功',
            'data': data
        })
        
    except Exception as e:
        # 记录错误日志
        print(f'微信登录异常: {str(e)}')
        return jsonify({
            'code': 500,
            'message': f'服务器内部错误: {str(e)}',
            'data': None
        })

@wechat_bp.route('/test', methods=['GET'])
def test_wechat_api():
    """
    测试微信API连接是否正常
    """
    return jsonify({
        'code': 200,
        'message': '微信登录接口就绪',
        'data': {
            'current_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            'api_url': WECHAT_API_URL
        }
    })